package com.dkm.orproject.dkmoa.action;

import com.alibaba.fastjson.JSON;
import com.dkm.orproject.dkmoa.domain.OaCompany;
import com.dkm.orproject.dkmoa.domain.OaLog;
import com.dkm.orproject.dkmoa.domain.OaPersonnel;
import com.dkm.orproject.dkmoa.service.OaCompangService;
import com.dkm.orproject.utils.jwt.login.UserLoginToken;
import com.dkm.orproject.utils.utils.IdToobtainUtils;
import com.dkm.orproject.utils.utils.Tools;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.*;


/**
 *  @ClassName : OaPersonnelAction  //类名
 *  @Description : 公司的控制  //描述
 *  @Author : 石智诚  //作者
 *  @Date: 2020-07-30 09:28  //时间
 */
@RestController
@RequestMapping("OaCompanyAction")
public class OaCompanyAction {

    /**
     * 公司服务接口
     */
    @Resource
    OaCompangService companyService;
    /**
     * 雪花算法
     */
    @Resource
    IdToobtainUtils utils;
    /**
     * 工具类
     */
    @Resource
    Tools tools;
    /**
     * 日志
     */
    OaLog log;
    /**
     * 登陆人
     */
    OaPersonnel person;

    /**
     * 回调map
     */
    Map<String,Object> map;
    /**
     * 行数
     */
    int row;

        /**
         * 公司信息增加
         * @param company 公司信息
         * @return 信息
         */
     @PostMapping("addOrUpdateCompany")
     @UserLoginToken
     public Map<String, Object> addOrUpdateCompany (@RequestBody OaCompany  company, HttpServletRequest request){
            rowMap(request);
            if(ObjectUtils.isEmpty(company)){
                tools.rowMap(map,0,null);
            }
            try {
                if (company.getPkCompanyId()!=null &&company.getPkCompanyId()>0){
                    //为增加更新人和更新时间
                    company.setUpdatedBy(person.getPersonnelName());
                    company.setUpdatedTime(new Date());
                   row= companyService.updateCompanyById(company);
                   log.setLogTitle("公司更新模块");
                }else {
                    company.setIsRevision("1");
                    //公司id 随机生成
                    company.setPkCompanyId(utils.getNumberId());
                    //创建人
                    company.setCreatedBy(person.getPersonnelName());
                    row=companyService.insert(company);
                    log.setLogTitle("增加模块");
                }
                log.setLogBody(JSON.toJSON(company).toString());
                log.setLogType("1");
                tools.rowMap(map, row, log);
            } catch (Exception e) {
                addErrorLog(request,"公司增加或者更新模块",e);
            }
            return map;
        }

    /**
     * 查询所有公司(下拉框)
     * @param request 请求
     * @return id 和名字
     */
    @GetMapping("companyFindByAll")
    @UserLoginToken
    public Map<String,Object> findByAll(HttpServletRequest request){
        try{
            List<OaCompany> all = companyService.findByAll();
            return Tools.maps(all, null);
        }catch (Exception e){
            addErrorLog(request,"公司查询",e);
        }
        return null;
    }
    /**
     * 根据id查询的公司信息(编辑)
     *
     * @param pkCompanyId 公司Id
     * @param request 请求
     * @return 公司的信息
     */
    @GetMapping("selectById/{pkCompanyId}")
    @UserLoginToken
    public Map<String, Object> selectById(@PathVariable("pkCompanyId") Long pkCompanyId, HttpServletRequest request) {
        rowMap(request);
        try {
           OaCompany company = companyService.selectByPrimaryKey(pkCompanyId);
            map.put("data",company);
        } catch (Exception e) {
            addErrorLog(request,"根据id查询的公司信息(编辑)",e);
        }
        return  map;
    }

    /**
     * 根据id查询公司名
     * @param pkCompanyId 公司名
     * @param request 请求
     * @return 公司模型
     */
    @GetMapping("select/{pkCompanyId}")
    @UserLoginToken
    public Map<String, Object> select(@PathVariable("pkCompanyId") Long pkCompanyId, HttpServletRequest request) {
        rowMap(request);
        try {
             map = companyService.find(pkCompanyId);
        } catch (Exception e) {
            addErrorLog(request,"根据id查询公司模块",e);
        }
        return  map;
    }

    /**
     * 逻辑删除
     * @param pkCompanyId 公司ID
     * @param request       操作的
     * @return 操作的结果
     */
    @PutMapping("updateById/{pkCompanyId}")
    @UserLoginToken
    public Map<String, Object> updateById(@PathVariable("pkCompanyId") Long pkCompanyId, HttpServletRequest request) {
        rowMap(request);
        try {
            int i = companyService.updateById(pkCompanyId,person.getPersonnelName());
            log.setLogTitle("公司删除成功");
            log.setLogBody(JSON.toJSON(i).toString());
            log.setLogType("1");
            tools.rowMap(map, i, log);

        } catch (Exception e) {
            addErrorLog(request,"公司删除",e);
        }
        return map;
    }

    /**
     * 删除
     * @param pkCompanyId 公司ID
     * @param request       操作的
     * @return 结果
     */
    @UserLoginToken
    @DeleteMapping("deleteCompany/{pkCompanyId}")
    public Map<String, Object> delete(@PathVariable("pkCompanyId") Long pkCompanyId, HttpServletRequest request) {
       rowMap(request);
        try {
            row= companyService.deleteById(pkCompanyId);
            log.setLogTitle("公司删除模块");
            log.setLogBody(JSON.toJSON(row).toString());
            log.setLogType("1");
            tools.rowMap(map, row, log);
        } catch (Exception e) {
            addErrorLog(request,"公司删除模块",e);
        }
        return map;
    }
    /**
     * 查询分页
     *
     * @param company 公司信息
     * @param page      第几页
     * @param limit     返回的数据条数
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @param request   请求
     * @return 分页的数据和总数
     */
    @UserLoginToken
    @GetMapping("findAll")
    public Map<String, Object> findAll(OaCompany company,
                                       Integer page, Integer limit,
                                       String startTime, String endTime,
                                       HttpServletRequest request) {
        try {
            List<OaCompany> all = companyService.findAll(company, page, limit, startTime, endTime);
            Long count = companyService.rowCount(company, startTime, endTime);
            return Tools.maps(all, count);
        } catch (Exception e) {
            addErrorLog(request,"公司查询模块",e);
        }
        return null;
    }

    /**
     * 批量删除
     * @param ids 人员id的集合
     * @param request  请求
     * @return 删除的行数
     */
    @PostMapping("updateAll")
    @UserLoginToken
    public Map<String, Object> updateAll(@RequestParam(value = "ids[]",required = false) Long[] ids, HttpServletRequest request) {
        List<Long> idssi;

        if(ObjectUtils.isEmpty(ids)){
            return tools.rowMap(map,0,null);
        }else{
            idssi=Arrays.asList(ids);
        }
       rowMap(request);
        try {
            int updateAll = companyService.updateAll(idssi,person.getPersonnelName());
            log.setLogTitle("公司逻辑删除模块");
            log.setLogBody(JSON.toJSON(idssi).toString());
            log.setLogType("1");
            tools.rowMap(map, updateAll, log);
        } catch (Exception e) {
            addErrorLog(request,"公司逻辑删除模块",e);
        }
        return map;
    }

    /**
     * 批量删除
     * @param ids 人员id的集合
     * @param request 请求
     * @return 是否删除的
     */
    @DeleteMapping("deleteAll")
    @UserLoginToken
   public Map<String, Object> deleteAll(@RequestParam(value = "ids[]", required = false) Long[] ids, HttpServletRequest request) {
        List<Long> idss;
        //判断转入的数据是否为空
        if (ObjectUtils.isEmpty(ids)){
            return tools.rowMap(map,0,null);
        }else {
            idss= Arrays.asList(ids);
        }
        rowMap(request);
        try {
            int deleteAll = companyService.deleteAll(idss);
            log.setLogTitle("公司删除模块");
            log.setLogBody(JSON.toJSON(deleteAll).toString());
            log.setLogType("1");
            tools.rowMap(map, deleteAll, log);
        } catch (Exception e) {
            addErrorLog(request,"公司删除模块",e);
        }
        return  map;
    }

    /**
     * 简化代码
     * @param request 请求
     */
    private void rowMap(HttpServletRequest request){
        //新建返回Map模型
        map=new HashMap<>(16);
        //获取登陆人信息
        person= (OaPersonnel) request.getSession().getAttribute("user");
        //新建日志
        log=new OaLog();
        //得到ip
        log.setLogIp(request.getRemoteAddr());
        //登陆人名称
        log.setCreatedBy(person.getPersonnelName());
    }

    private void addErrorLog(HttpServletRequest request,String title,Exception e){
        OaPersonnel personnel= (OaPersonnel) request.getSession().getAttribute("user");
        log=new OaLog();
        log.setLogType("0");
        e.printStackTrace();
        log.setLogBody(e.getLocalizedMessage());
        log.setLogTitle(title);
        log.setLogIp(request.getRemoteAddr());
        if(ObjectUtils.isEmpty(personnel)){
            log.setCreatedBy(person.getPersonnelName());
        }
        tools.errorMap(log);
    }
}
